正規表達式 Regular Expression ,早出現在 Perl 語言裡面,但是因為太好用所以即使不寫 Perl 也會遇到他,像是:
vim 的搜尋取代也是 Regular Expression
sed 也吃 Regular Expression
grep 也吃一部分的 Regular Expression
上面提到 sed 與 grep 可以吃一些的正規表達,以下我們來講講一些常用的正規表達字元吧:
^ :表示一行的最開頭,像是 ^function 就只會找出那些一開頭就有 function 的內容。$ :表示一行的最尾,像是 ;$ 表示過濾出分號結尾的那幾行。[] :用 [] 包起來的字元,表示裡面的字元任選一個,像是 [aA]ction 就可以找出 action 或是 Action
[^] : [] 包起來多一個 ^ 就表示排除,像是 [^D]uration 就會找出 duration
. :這個 . 代表任意一個字元,像是 ..t 可以找出 cat 、 pet 等等。* :這個 * 與丙級檢定裡面的 * 完全不同,他表示前面的字元可以重複無限個(也可以沒有),像是 ap*le 可以找出 ale 、 aple 、 apple 、 appple等等。grep 指令在第九天就稍微介紹過了,所以有興趣的請參考一下鐵人賽第九天的文章。
今天就來介紹一下 sed 跟正規表達搭配起來的用法吧, sed 的可以用正規表達來做搜尋取代,語法如下:
sed "s/搜尋/取代/g"
其中搜尋的部分當然可以用正規表達,而取代的部分假如你只是要加入字串,可以用 & 號把原本選起來字串保留下來,像是這樣(第一行寫兩次原本的搜尋條件,第二行則是用 & 號:
#sed "s/<div class=\"/<div class=\"items /g"
sed "s/<div class=\"/&items /g"
這樣就可以把所有的 div 加上 items 這個 class。
還有像有時候換行前塞了一堆空白,看不到但是又覺得不順眼,這時候就可以用以下的指令把指令最後面的空白全部拔掉:
sed "s/\ *$//g"
目前常用的 sed 就到這裡了,不過 sed 預設會把資料輸出到 stdout ,如果要直接修改檔案呢?
sed -i "s/\ *$//g"
目前常用的 sed 指令大概就到這邊啦。
我是誰?
我是 dd-han ,可以叫我呆翰,是國立臺中科技大學的延畢生 與 創科資訊的時習生。